TFM: Predicción de Impacto del Salario Mínimo¶

  • Introducción
  • Objetivos
  • Base de Datos
    • Sets Empleados

Introducción¶

A lo largo de las últimas décadas se ha popularizado entre las instituciones internacionales de diversos países el uso del salario mínimo como medida paliativa a los bajos salariados percibidos entre las clases menos pudientes.

Estos actos parten de la premisa de que el establecimiento o incremento de un salario mínimo impulsará la capacidad adquisitiva de la clase afectada, produciendo así una mayor demanda de bienes y servicios por parte de la misma y en consecuencia impulsando el crecimiento económico. Si bien es cierto que la teoría económica respalda este argumento, los efectos negativos de estas políticas han sido ampliamente estudiados. Desde el lado crítico hacia estas políticas se argumenta que en determinadas circunstancias un incremento del salario mínimo puede fomentar el empleo informal o en última instancia destruir empleo.

El presente estudio no tendrá como objetivo específico afirmar o negar la efectividad del salario mínimo ni matizar los grupos más vulnerables a las bondades o daños del mismo, sino alcanzar un entendimiento relativo de las condicones adecuadas para aplicar el salario mínimo, así como entender qué efectos tiene este salario mínimo aplicado a nivel nacional sobre las diferentes regiones que componen el país considerando sus particularidades económicas.

Objetivos¶

Los objetivos del presente estudio será responder a las siguientes preguentas:

  • ¿Cuáles son los efectos económicos generales de un incremento del salario mínimo en cada comunidad autónoma?
  • ¿Existe un punto y ritmo óptimo de subida del salario mínimo con el que se puedan maximizar los beneficios que aporta el mismo?

Lo que se espera obtener con el presente trabajo respondiendo a estas preguntas no es tanto si es positivo o negativo aplicar un salario mínimo sino cuáles son los factores económicos que pueden permitir implementarlo con relativo éxito.

Base de Datos¶

Sets Empleados¶

Los datos utilizados para el presente análisis tienen como fuente principal el Instituto Nacional de Estadística, la Agencia Tributaria Española y el Ministerio de Seguridad Social. Los sets de datos empleados y sus respectivas variables son:

  • Encuestas de estructura salarial: Proporciona información de los salarios por hora tanto a nivel nacional como a nivel autonómico hasta por 3 segmentaciones, siendo las utilizadas en este caso las segmentaciones por por sexo y servicio. También se ha obtenido de este dataset el salario medio mensual por decil, comunidad autónoma y tipo de jornada, así como la desigualdad medida por el índice de Gini e índice S80/S20.

  • Índices de precios de consumo: Proporciona información sobre la evolución de los precios a nivel mensual, segmentado por tipo de índice y a nivel mensual.

  • Índice de precios industriales: Proporciona información sobre la evoluación de precios industriales, segmentados por el mercado objetivo.

  • Encuesta de presupuestos familiares: Proporciona información sobre el gasto medio de los hogares a nivel autonómico y de concepto de gasto clasificados por grupo de producto.

  • Estadísticas de movilidad nacional y geografía: Proporciona información acerca del número de parados, que incluye información también sobre los parados de larga duración.

  • Muestra Continua de Vidas Laborales: Obtenidas de las bases de datos del ministerio de seguridad social, contiene información sobre el número de afiliados por comunidad autónoma y sector laboral

  • Encuesta de condiciones de vida: Contiene información sobre las condiciones de vida de personas y hogares en España, como puede ser la tasa de riesgo de pobreza por comunidad autónoma, personas con carencia material etc.

  • Estadística Estructural de Empresas: Contiene información del número de empresas, así como del flujo de altas y bajas de las mismas.

Las variables de estos test a lo largo de las diferentes segmentaciones serán sometidas a análisis con el fin de obtener y justificar cuáles son las más útiles y relevantes para explicar los efectos del salario mínimo. El limpiado básico (correcciones de decimales, cambio de nombres de columnas para facilitar su uso y algunas fusiones de tables) se han hecho previo al análisis que se va a realizar a continuación.

Análisis y Modelos¶

Importación de paquetes¶

Los análisis pertinentes así como la realización de los modelos se hará usando el lenguaje de programación python, en concreto usando las librerías de pandas para el análisis y sklearn y otros módulos más específicos para la creación y testeo de modelos. Para la creación de gráficos ilustrativos para el análisis se utilizará matplotlib y seaborn

In [2]:
import pandas as pd
import sklearn as sk
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.dates import AutoDateLocator
import matplotlib.dates as mdates

Definición de funciones¶

In [3]:
def create_basic_plot(x, y, xlabel="", ylabel="", title="", xticks_rotation=0, style="whitegrid", color="dodgerblue", marker = "o",figsize=(10, 6), save_path=None, label = "Salario Mínimo"):
    """
    Create a professional-looking plot using matplotlib and seaborn.

    Parameters:
        x (array-like): Data for the x-axis.
        y (array-like): Data for the y-axis.
        xlabel (str): Label for the x-axis.
        ylabel (str): Label for the y-axis.
        title (str): Title of the plot.
        xticks_rotation (int): Rotation angle for x-axis ticks.
        style (str): Seaborn style to use (e.g., "whitegrid", "darkgrid").
        color (str): Color of the plot line or bars.
        figsize (tuple): Size of the figure (width, height).
        save_path (str): If provided, saves the plot to the given file path.

    Returns:
        None
    """
    # Set the Seaborn style for better aesthetics
    sns.set_style(style)
    
    # Create the plot
    plt.figure(figsize=figsize)
    plt.plot(x, y, marker=marker, color=color, linewidth=2.5, markersize=8, label = label)
    
    # Add labels, title, and grid
    plt.xlabel(xlabel, fontsize=12, labelpad=10)
    plt.ylabel(ylabel, fontsize=12, labelpad=10)
    plt.title(title, fontsize=14, weight="bold", pad=15)
    plt.xticks(rotation=xticks_rotation, fontsize=10)
    plt.yticks(fontsize=10)
    plt.grid(visible=True, linestyle="--", alpha=0.7)
    
    # Add a legend if needed
    plt.legend(loc="best", fontsize=10, frameon=True)
    
    # Improve layout
    plt.tight_layout()
    locator = AutoDateLocator()  # Ajusta automáticamente el número de fechas visibles
    plt.gca().xaxis.set_major_locator(locator)
    
    # Save the plot if save_path is provided
    if save_path:
        plt.savefig(save_path, dpi=300, bbox_inches="tight")
        print(f"Plot saved to {save_path}")
    
    # Show the plot
    plt.show()


def create_dual_plot(
    x, y1, y2, xlabel="", ylabel1="", ylabel2="", title="",
    xticks_rotation=0, style="whitegrid",
    color1="dodgerblue", color2="orange", marker1="o", marker2="s",
    label1="Serie 1", label2="Serie 2", figsize=(10, 6),
    secondary_y=False, save_path=None
):
    """
    Create a professional-looking plot with two y-series using matplotlib and seaborn,
    with an optional secondary y-axis.

    Parameters:
        x (array-like): Data for the x-axis.
        y1 (array-like): Data for the first y-axis series.
        y2 (array-like): Data for the second y-axis series.
        xlabel (str): Label for the x-axis.
        ylabel1 (str): Label for the first y-axis.
        ylabel2 (str): Label for the second y-axis (if secondary_y is True).
        title (str): Title of the plot.
        xticks_rotation (int): Rotation angle for x-axis ticks.
        style (str): Seaborn style to use (e.g., "whitegrid", "darkgrid").
        color1 (str): Color for the first y-axis series.
        color2 (str): Color for the second y-axis series.
        marker1 (str): Marker style for the first y-axis series.
        marker2 (str): Marker style for the second y-axis series.
        label1 (str): Label for the first y-axis series (for the legend).
        label2 (str): Label for the second y-axis series (for the legend).
        figsize (tuple): Size of the figure (width, height).
        secondary_y (bool): Whether to use a secondary y-axis for the second series.
        save_path (str): If provided, saves the plot to the given file path.

    Returns:
        None
    """
    # Set the Seaborn style for better aesthetics
    sns.set_style(style)

    # Create the figure and primary axis
    fig, ax1 = plt.subplots(figsize=figsize)

    # Plot the first series on the primary y-axis
    line1 = ax1.plot(x, y1, marker=marker1, color=color1, linewidth=2.5, markersize=8, label=label1)
    ax1.plot(x, y1, marker=marker1, color=color1, linewidth=2.5, markersize=8, label=label1)
    ax1.set_xlabel(xlabel, fontsize=12, labelpad=10)
    ax1.set_ylabel(ylabel1, fontsize=12, labelpad=10, color=color1)
    ax1.tick_params(axis='y')
    ax1.tick_params(axis='x', rotation=xticks_rotation)
    ax1.grid(visible=True, linestyle="--", alpha=0.7)

    if secondary_y:
        # Add a second y-axis
        ax2 = ax1.twinx()
        line2 = ax2.plot(x, y2, marker=marker2, color=color2, linewidth=2.5, markersize=8, label=label2)
        ax2.plot(x, y2, marker=marker2, color=color2, linewidth=2.5, markersize=8, label=label2)
        ax2.set_ylabel(ylabel2, fontsize=12, labelpad=10, color=color2)
        ax2.tick_params(axis='y')
        #ax2.legend(loc="upper right", fontsize=10, frameon=True)
    else:
        line2 = []
        # Plot the second series on the primary y-axis
        ax1.plot(x, y2, marker=marker2, color=color2, linewidth=2.5, markersize=8, label=label2)
        #ax1.legend(loc="best", fontsize=10, frameon=True)

    # Add title and legend for the first axis
    lines = line1 + line2
    labels = [l.get_label() for l in lines]
    ax1.legend(lines, labels, loc="best", fontsize=10, frameon=True)
    fig.suptitle(title, fontsize=14, weight="bold", y=1.02)

    # Adjust layout
    fig.tight_layout()

    # Adjust x-axis for date formatting if needed
    locator = AutoDateLocator()  # Automatically adjusts visible date labels
    ax1.xaxis.set_major_locator(locator)

    # Save the plot if save_path is provided
    if save_path:
        plt.savefig(save_path, dpi=300, bbox_inches="tight")
        print(f"Plot saved to {save_path}")

    # Show the plot
    plt.show()


def create_multi_category_plot(data, x_col, y_col, category_col, xlabel="", ylabel="", label = None,title="", xticks_rotation=0, style="whitegrid", palette="husl", figsize=(12, 7), save_path=None):
    """
    Create a professional-looking multi-line plot for different categories.

    Parameters:
        data (DataFrame): The dataset containing the data to plot.
        x_col (str): Column name for the x-axis.
        y_col (str): Column name for the y-axis.
        category_col (str): Column name for the categories (lines in the plot).
        xlabel (str): Label for the x-axis.
        ylabel (str): Label for the y-axis.
        title (str): Title of the plot.
        xticks_rotation (int): Rotation angle for x-axis ticks.
        style (str): Seaborn style to use (e.g., "whitegrid", "darkgrid").
        palette (str): Color palette for the categories.
        figsize (tuple): Size of the figure (width, height).
        save_path (str): If provided, saves the plot to the given file path.

    Returns:
        None
    """
    if label is None:
        label = category_col
    # Set Seaborn style for better aesthetics
    sns.set_style(style)
    
    # Create the plot
    plt.figure(figsize=figsize)
    unique_categories = data[category_col].unique()
    colors = sns.color_palette(palette, len(unique_categories))
    
    for i, category in enumerate(unique_categories):
        subset = data[data[category_col] == category]
        plt.plot(
            subset[x_col], 
            subset[y_col], 
            #marker="o", 
            linewidth=2.5, 
            markersize=8, 
            label=category, 
            color=colors[i]
        )
    
    # Add labels, title, and grid
    plt.xlabel(xlabel, fontsize=12, labelpad=10)
    plt.ylabel(ylabel, fontsize=12, labelpad=10)
    plt.title(title, fontsize=14, weight="bold", pad=15)
    plt.xticks(rotation=xticks_rotation, fontsize=10)
    plt.yticks(fontsize=10)
    plt.grid(visible=True, linestyle="--", alpha=0.7)
    
    # Add a legend
    plt.legend(title=label, fontsize=10, title_fontsize=12, loc="best", frameon=True)
    
    # Improve layout
    plt.tight_layout()
    locator = AutoDateLocator()  # Ajusta automáticamente el número de fechas visibles
    plt.gca().xaxis.set_major_locator(locator)
    # Save the plot if save_path is provided
    if save_path:
        plt.savefig(save_path, dpi=300, bbox_inches="tight")
        print(f"Plot saved to {save_path}")
    
    # Show the plot
    plt.show()



def create_category_subplots(data, x_col, y_col, category_col, xlabel="", ylabel="", title="", 
                             xticks_rotation=45, style="whitegrid", palette="husl", 
                             figsize=(30, 22.5), n_cols=3, save_path=None):
    """
    Create individual subplots for each category in the data with adjusted margins.
    """
    import matplotlib.ticker as mticker
    
    # Set Seaborn style for aesthetics
    sns.set_style(style)
    
    # Get unique categories and assign colors
    unique_categories = data[category_col].unique()
    n_categories = len(unique_categories)
    n_rows = -(-n_categories // n_cols)  # Calculate rows (ceiling division)
    colors = sns.color_palette(palette, n_categories)
    
    # Create subplots
    fig, axes = plt.subplots(n_rows, n_cols, figsize=figsize, sharex=False, sharey=True)
    axes = axes.flatten()  # Flatten to iterate easily

    for i, category in enumerate(unique_categories):
        ax = axes[i]
        subset = data[data[category_col] == category]
        ax.plot(
            subset[x_col], 
            subset[y_col], 
            #marker="o", 
            linewidth=1.5, 
            markersize=4, 
            label=category, 
            color=colors[i]
        )
        ax.set_title(f"{category}", fontsize=10, weight="bold", pad=5)
        ax.grid(visible=True, linestyle="--", alpha=0.7)

        # Set x-axis ticks to show fewer values
        ax.xaxis.set_major_locator(mticker.MaxNLocator(5))
        ax.tick_params(axis='x', rotation=xticks_rotation, labelsize=6)
        ax.tick_params(axis='y', labelsize=6)

    # Hide unused subplots
    for j in range(len(axes)):
        if j >= n_categories:
            axes[j].set_visible(False)

    # Set labels for shared axes
    fig.text(0.5, 0.02, xlabel, ha='center', fontsize=12)  # Adjusted position
    fig.text(0.04, 0.5, ylabel, va='center', rotation='vertical', fontsize=12)  # Adjusted position
    
    # Add the main title
    fig.suptitle(title, fontsize=16, weight="bold", y=0.98)

    # Adjust layout with extra margins
    fig.subplots_adjust(left=0.08, right=0.97, bottom=0.08, top=0.92, wspace=0.3, hspace=1)
    fig.tight_layout()
    # Save the figure if save_path is provided
    if save_path:
        plt.savefig(save_path, dpi=300, bbox_inches="tight")
        print(f"Plot saved to {save_path}")

    # Show the plot
    plt.show()

Análisis descriptivo¶

La base de este análisis consistirá en considerar un grupo de variables de partida que nos permita describir un sistema económico a través de un determinado número de variables o ratios, y que, a través del salario mínimo, ver como ese sistema pasa del estado A al estado B. Esto implica que las variables predictoras también pueden ser utilizadas como resultados en el entrenamiento, ya que nos interesa ver cómo estas evolucionan como resutado de los cambios en el salario mínimo.

En última instancia nos interesa analizar qué pasaría si estando en el estado inicial A con un salario mínimo interprofesional (o una medida derivada del mismo) X que nos lleva al estado B, qué ocurriría si el SMI en su lugar fuese Y.

Análisis general de variables¶

Salario Mínimo Inteprofesional¶

La principal variable independiente y que será el principal input será el salario mínimo interprofesinal (smi), que es fijado por ley y generalmente empieza aplicar todos los años en enero o, alternativamente se aprueba más adelante pero con efecto retroactivo desde enero.

In [4]:
smi = pd.read_csv("../../processed_data/salarios/salarios_smis_aeat.csv")[['periodo','smi_14']].drop_duplicates()
smi
Out[4]:
periodo smi_14
0 2008 600.0
252 2009 624.0
504 2010 633.3
756 2011 641.4
1008 2012 641.4
1260 2013 645.3
1512 2014 645.3
1764 2015 648.6
2016 2016 655.2
2268 2017 707.7
2520 2018 735.9
2772 2019 900.0
3024 2020 950.0
3248 2021 965.0
3472 2022 1000.0
In [5]:
create_basic_plot(x=smi['periodo'], y=smi['smi_14'], xlabel="Año", ylabel="SMI", title="Evoluación del SMI", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), save_path="../../images/smi.png")
Plot saved to ../../images/smi.png
No description has been provided for this image

La evolución del SMI nominal es bastante irregular, creciendo un 22.65% en 10 años y luego una cantidad muy similar (22.3%) en solo un año. Tengamos en cuenta que este SMI es en términos nominales y no tiene en cuenta la inflación, por ello es importante considerar el ipc dentro de la ecuación para obtener un resultado en relación de poder adquisitivo.

In [6]:
ipc = pd.read_csv("../../processed_data/gasto_ipc_ipri/ipc.csv")
ipc_nacional = ipc[(ipc['ccaa'] == "Nacional") & (ipc['grupo_indice'] == "Índice general") & (ipc['tipo_dato'] == "Índice") & (ipc.mes==1) & (ipc.año>=2008)][['año', 'Total']]
smi = smi.merge(ipc_nacional, left_on = "periodo", right_on="año")
smi['smi_ajustado'] = smi['smi_14']/smi['Total']*100
create_basic_plot(x=smi['periodo'], y=smi['smi_ajustado'], xlabel="Año", ylabel="SMI", title="SMI Ajustado por Inflación a Precios de 2021", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), save_path="../../images/smi_ajustado.png")
Plot saved to ../../images/smi_ajustado.png
No description has been provided for this image

Observamos ahora que la evolución del salario mínimo, pese a que conserva el gran incremento entre 2018 y 2019, tiene variaciones negativas en determinados años y la gamma de posibles incrementos que aporta es algo más amplia.

In [7]:
smi.columns
Out[7]:
Index(['periodo', 'smi_14', 'año', 'Total', 'smi_ajustado'], dtype='object')

IPC¶

El índice de precios de consumo (IPC) describe la evolución de los precios a lo largo del tiempo, tomando como base 100 un determinado año y calculando el resto de valores a partir de los incrementos que se producen año a año. Este índice se puede desglosar en varias categorías, lo que nos puede permitir ver cómo evoluciona cada una de ellas y qué valor está aportando al índice total.

In [8]:
ipc.grupo_indice.unique()
Out[8]:
array(['Índice general', '01 Alimentos y bebidas no alcohólicas',
       '02 Bebidas alcohólicas y tabaco', '03 Vestido y calzado',
       '04 Vivienda, agua, electricidad, gas y otros combustibles',
       '05 Muebles, artículos del hogar y artículos para el mantenimiento corriente del hogar',
       '06 Sanidad', '07 Transporte', '08 Comunicaciones',
       '09 Ocio y cultura', '10 Enseñanza', '11 Restaurantes y hoteles',
       '12 Otros bienes y servicios'], dtype=object)
In [9]:
ipc
Out[9]:
ccaa grupo_indice tipo_dato periodo Total mes año periodo_fecha
0 Nacional Índice general Índice 2024M10 NaN 10 2024 2024-10-01
1 Nacional Índice general Índice 2024M09 115.009 9 2024 2024-09-01
2 Nacional Índice general Índice 2024M08 115.707 8 2024 2024-08-01
3 Nacional Índice general Índice 2024M07 115.660 7 2024 2024-07-01
4 Nacional Índice general Índice 2024M06 116.212 6 2024 2024-06-01
... ... ... ... ... ... ... ... ...
284955 Melilla 12 Otros bienes y servicios Variación en lo que va de año 2002M05 2.300 5 2002 2002-05-01
284956 Melilla 12 Otros bienes y servicios Variación en lo que va de año 2002M04 1.900 4 2002 2002-04-01
284957 Melilla 12 Otros bienes y servicios Variación en lo que va de año 2002M03 1.900 3 2002 2002-03-01
284958 Melilla 12 Otros bienes y servicios Variación en lo que va de año 2002M02 1.700 2 2002 2002-02-01
284959 Melilla 12 Otros bienes y servicios Variación en lo que va de año 2002M01 NaN 1 2002 2002-01-01

284960 rows × 8 columns

In [10]:
ipc_nacional_es = ipc[(ipc['ccaa'] == "Nacional") & (ipc['grupo_indice'] == "Índice general") & (ipc['tipo_dato'] == "Índice")  ][['periodo_fecha', 'Total']].sort_values('periodo_fecha', ascending = True)

create_basic_plot(ipc_nacional_es['periodo_fecha'], ipc_nacional_es['Total'], xlabel="Periodo", ylabel="IPC", title="Evolución del IPC (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6),marker = None , label = "IPC",save_path="../../images/ipc.png")
Plot saved to ../../images/ipc.png
No description has been provided for this image
In [11]:
create_multi_category_plot(data = ipc[(ipc['ccaa']=="Nacional") & (ipc['tipo_dato'] == "Índice")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="grupo_indice", xlabel="Año", ylabel="IPC", title="IPC", xticks_rotation=0, style="whitegrid", palette="Set2", figsize=(12, 7), save_path="../../images/ipc_grupos.png")
Plot saved to ../../images/ipc_grupos.png
No description has been provided for this image
In [12]:
create_category_subplots(data = ipc[(ipc['ccaa']=="Nacional") & (ipc['tipo_dato'] == "Índice")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="grupo_indice", xlabel="Año", ylabel="IPC", title="IPC", xticks_rotation=0, style="whitegrid", palette="Set2", figsize=(12, 7), save_path="../../images/ipc_grupos.png")
Plot saved to ../../images/ipc_grupos.png
No description has been provided for this image

Parece claro que salvo contadas excepciones como la sanidad, ocio y cultura, comunicaciones y vestido y calzado el resto de índices siguen una clara tendencia creciente. Dado que este estudio empleará datos de comunidades autónomas es intersante también observar la evolución del IPC en cada una de estas.

In [13]:
create_multi_category_plot(data = ipc[(ipc['ccaa']!="Nacional") & (ipc['tipo_dato'] == "Índice") & (ipc["grupo_indice"] == "Índice general")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="ccaa", xlabel="Año", ylabel="IPC", title="IPC", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ipc_general_ccaa.png")
Plot saved to ../../images/ipc_general_ccaa.png
No description has been provided for this image

Parece claro que la evolución se produce de manera conjunta, tanto en tendencia como en estacionalidad. Veamos cómo es la variación interanual.

In [14]:
create_category_subplots(data = ipc[(ipc['ccaa']!="Nacional") & (ipc['tipo_dato'] == "Variación anual") & (ipc["grupo_indice"] == "Índice general")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="ccaa", xlabel="Año", ylabel="", title="Variación Anual Porcentual del IPC", style="whitegrid", palette="Set2", figsize=(12, 7), xticks_rotation=15,save_path="../../images/ipc_ccaa_subplots.png")
Plot saved to ../../images/ipc_ccaa_subplots.png
No description has been provided for this image

Se observa de manera clara que si bien en magnitud la variación puede diferir, el patrón es el mismo en todas las comunidades autónomas.

In [15]:
ipc.tipo_dato.unique()
Out[15]:
array(['Índice', 'Variación mensual', 'Variación anual',
       'Variación en lo que va de año'], dtype=object)

IPRI¶

El índice de precios industriales (IPRI) mide la evolución mensual de los precios de los productos fabricados por la industria y vendidos en el mercado interior en la primera etapa de su comercialización. Dada esta definición, es esperable suponer que una variación del IPRI puede ser un predictor de una futura del IPC al trasladarse esta subida al consumidor, por ello se ha incluido en este análisis.

In [16]:
ipri = pd.read_csv("../../processed_data/gasto_ipc_ipri/ipri.csv")
In [17]:
ipri = ipri[pd.to_datetime(ipri['periodo_fecha']) >= pd.to_datetime('2002-01-01')]
In [18]:
ipri_nacional = ipri[(ipri['ccaa'] == "Nacional") & (ipri['destino_economico'] == "Total industria") & (ipri['tipo_dato'] == "Índice")  ][['periodo_fecha', 'Total']].sort_values('periodo_fecha', ascending = True)

create_basic_plot(ipri_nacional['periodo_fecha'], ipri_nacional['Total'], xlabel="Periodo", ylabel="IPRI", title="Evolución del IPRI (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6),marker = None , label = "IPRI",save_path="../../images/ipc.png")
Plot saved to ../../images/ipc.png
No description has been provided for this image
In [19]:
ipc_ipri_nacional = ipc_nacional_es.merge(ipri_nacional[['periodo_fecha', 'Total']].rename(columns = {'Total': 'ipri'}), left_on = "periodo_fecha", right_on="periodo_fecha")
create_dual_plot(ipc_ipri_nacional['periodo_fecha'], ipc_ipri_nacional['Total'], ipc_ipri_nacional['ipri'], xlabel="Año", label1= "IPC", label2="IPRI", title="IPC y IPRI (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None ,save_path="../../images/ipc_ipri.png")
Plot saved to ../../images/ipc_ipri.png
No description has been provided for this image
In [20]:
cond = (ipc_ipri_nacional['periodo_fecha'] >= '2010-01-01') & (ipc_ipri_nacional['periodo_fecha'] <= '2012-01-01')
create_dual_plot(ipc_ipri_nacional[cond]['periodo_fecha'], ipc_ipri_nacional[cond]['Total'], ipc_ipri_nacional[cond]['ipri'], xlabel="Año", label1= "IPC", label2="IPRI", title="IPC y IPRI (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None ,save_path="../../images/ipc_ipri.png")
Plot saved to ../../images/ipc_ipri.png
No description has been provided for this image

Se observa que el movimiento de ambos es correlado hasta 2021, donde el IPRI se desliga y sube de manera mucho más agresiva. La correlación directa en la tendencia general viene además acompañada de una correlación más local entre el incremento del IPRI y un posterior incremento del IPC, veáse esta última imagen donde en varios meses el IPRI adelanta un incremento del IPC

Gasto Hogares¶

La Encuesta de Presupuestos Familiares del INE nos permite obtener información sobre el gasto medio por hogar y por familiar. Esto puede ser de gran utilidad, pues a diferencia del IPC por comunidad autónoma, que tiene un valor fijado en su respectivo territorio en un periodo dado, el gasto por hogar nos permite hacernos una idea de la variación de costes de vida entre las diferentes regiones del territorio Nacional.

In [21]:
gasto_hogares = pd.read_csv("../../processed_data/gasto_ipc_ipri/gasto_hogar.csv")
In [22]:
gasto_hogares.head(5)
Out[22]:
ccaa tipo_dato tipo_gasto grupo_gasto periodo Total absence_data
0 Total Nacional Dato base Gasto total Índice general 2023 6.298171e+08 NaN
1 Total Nacional Dato base Gasto total Índice general 2022 6.008695e+08 NaN
2 Total Nacional Dato base Gasto total Índice general 2021 5.517205e+08 NaN
3 Total Nacional Dato base Gasto total Índice general 2020 5.087382e+08 NaN
4 Total Nacional Dato base Gasto total Índice general 2019 5.668146e+08 NaN
In [23]:
gasto_persona = gasto_hogares[(gasto_hogares['grupo_gasto'] == "Índice general") & (gasto_hogares['tipo_gasto'] == "Gasto medio por persona") & (gasto_hogares['tipo_dato'] == "Dato base")]
In [24]:
gasto_persona_nacional = gasto_hogares[(gasto_hogares['ccaa'] == "Total Nacional") & (gasto_hogares['tipo_dato'] == "Dato base") & (gasto_hogares['grupo_gasto'] == "Índice general") & (gasto_hogares['tipo_gasto'] == "Gasto medio por persona")][['periodo', 'Total']]
In [25]:
create_basic_plot(gasto_persona_nacional['periodo'], gasto_persona_nacional['Total'], xlabel="Año", ylabel="Gasto (€)", title="Gasto medio por persona (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), label="Gasto por Persona",save_path="../../images/gasto_persona_nacional.png")
Plot saved to ../../images/gasto_persona_nacional.png
No description has been provided for this image
In [26]:
gasto_hogares.grupo_gasto.unique()
Out[26]:
array(['Índice general', '01 Alimentos y bebidas no alcohólicas',
       '02 Bebidas alcohólicas y tabaco', '03 Vestido y calzado',
       '04 Vivienda, agua, electricidad, gas y otros combustibles',
       '05 Muebles, artículos del hogar y artículos para el mantenimiento corriente del hogar',
       '06 Sanidad', '07 Transporte', '08 Comunicaciones',
       '09 Ocio y cultura', '10 Enseñanza', '11 Restaurantes y hoteles',
       '12 Otros bienes y servicios'], dtype=object)

El gasto total varía bastante a lo largo de los años, sufriendo una gran caída en 2020 por la pandemia y posteriorment un gran rebote, ya que se produjo un gran incremento del consumo. Es importante tener en cuenta que el gasto agregado, al tener incluidos gastos no necesarios para la subsistencia del individuo, no es tan indicativo del coste de vida en el país o en una determinada region.

Para tener un mejor entendimiento a este respecto, podemos focalizarnos en gastos específicos como alimentos, bebidas no alcohólicas, vivienda, gas electricidad, transporte y sanidad, que englobaremos bajo el manto de "gastos básicos"

In [27]:
# gastos_basicos = ['01 Alimentos y bebidas no alcohólicas', '04 Vivienda, agua, electricidad, gas y otros combustibles','06 Sanidad',  '07 Transporte']
gastos_basicos = ['01 Alimentos y bebidas no alcohólicas', '04 Vivienda, agua, electricidad, gas y otros combustibles']

gasto_basico = gasto_hogares[(gasto_hogares['tipo_gasto'] == "Gasto medio por persona") & (gasto_hogares['tipo_dato'] == "Dato base") & gasto_hogares.grupo_gasto.isin(gastos_basicos)]
In [28]:
gasto_basico
Out[28]:
ccaa tipo_dato tipo_gasto grupo_gasto periodo Total absence_data
720 Total Nacional Dato base Gasto medio por persona 01 Alimentos y bebidas no alcohólicas 2023 2145.40 NaN
721 Total Nacional Dato base Gasto medio por persona 01 Alimentos y bebidas no alcohólicas 2022 2044.49 NaN
722 Total Nacional Dato base Gasto medio por persona 01 Alimentos y bebidas no alcohólicas 2021 1935.89 NaN
723 Total Nacional Dato base Gasto medio por persona 01 Alimentos y bebidas no alcohólicas 2020 1840.02 NaN
724 Total Nacional Dato base Gasto medio por persona 01 Alimentos y bebidas no alcohólicas 2019 1722.11 NaN
... ... ... ... ... ... ... ...
67477 Melilla Dato base Gasto medio por persona 04 Vivienda, agua, electricidad, gas y otros c... 2010 2104.02 NaN
67478 Melilla Dato base Gasto medio por persona 04 Vivienda, agua, electricidad, gas y otros c... 2009 1827.15 NaN
67479 Melilla Dato base Gasto medio por persona 04 Vivienda, agua, electricidad, gas y otros c... 2008 1663.17 NaN
67480 Melilla Dato base Gasto medio por persona 04 Vivienda, agua, electricidad, gas y otros c... 2007 1715.69 NaN
67481 Melilla Dato base Gasto medio por persona 04 Vivienda, agua, electricidad, gas y otros c... 2006 1422.23 NaN

720 rows × 7 columns

In [29]:
gasto_basico_nacional = gasto_basico[(gasto_basico['ccaa'] == "Total Nacional")].groupby(['periodo'], as_index=False).sum(numeric_only=True)
create_basic_plot(gasto_basico_nacional['periodo'], gasto_basico_nacional['Total'], xlabel="Año", ylabel="Gasto (€)", title="Gasto básicos medios por persona (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), label="Gasto por Persona",save_path="../../images/gasto_basico_persona_nacional.png")
Plot saved to ../../images/gasto_basico_persona_nacional.png
No description has been provided for this image
In [30]:
gasto_basico_nacional_smi = gasto_basico_nacional.rename(columns={'Total': 'gasto_basico'}).merge(smi, how='right', on="periodo")
create_dual_plot(gasto_basico_nacional_smi['periodo'], gasto_basico_nacional_smi['gasto_basico'], gasto_basico_nacional_smi['smi_14'], xlabel="Año", ylabel1="Gasto basico(€)", ylabel2="SMI (€)" ,label1= "Gastos básicos", label2="SMI", title="Gastos Básicos y SMI", xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None, secondary_y=True ,save_path="../../images/gastos_basicos_smi_nacional.png")
Plot saved to ../../images/gastos_basicos_smi_nacional.png
No description has been provided for this image

Vemos que ahora el gasto tiene una evolución algo menos volátil y de hecho sigue una evolución bastante más parecida al IPC general y también tiene una clara correlación con el SMI, aunque dada la baja proporción de trabajadores que percibe el salario mínimo, no necesariamente hablamos de una relación causal. Para hacernos una idea de las diferencias en costes en las diferentes comunidades autónomas, veamos cómo evoluciona el gasto por persona en las 3 comunidades autónomas con más gasto medio y con menos gasto medio.

In [31]:
CCAA_mas_gasto = ['País Vasco', 'Madrid, Comunidad de', 'Navarra, Comunidad Foral de']
CCAA_menos_gasto = ['Extremadura', 'Canarias', 'Murcia, Región de']
CCAA_mostrar = CCAA_mas_gasto+CCAA_menos_gasto
gasto_basico_ccaa = gasto_basico[(gasto_basico['ccaa'].isin(CCAA_mostrar))].groupby(['periodo','ccaa'], as_index=False).sum(numeric_only=True)
create_multi_category_plot(data = gasto_basico_ccaa, x_col="periodo", y_col="Total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Gasto(€)", title="Gastos básicos medios por persona (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ipc_general_ccaa.png")
Plot saved to ../../images/ipc_general_ccaa.png
No description has been provided for this image

La tendencia pese a ser general presenta variaciones mensuales relevantes, así como diferentes notables entre las diferentes comunidades autónomas y el gasto por persona que tiene cada una, encontrándonos diferencias superiores al 50%. Estos valores los usaremos más adelante en este análisis para crear ratios útiles que nos permitan entender el poder real de compra que que tiene el salario mínimo en las diferentes regiones.

Salarios¶

Los salarios son necesarios para entender la coyuntura de cada territorio, por lo que es importante estudiar cómo han variado con el tiempo y así poder identificar posibles grupos afectados por el salario mínimo.

In [32]:
salarios_ocupacion = pd.read_csv("../../processed_data/salarios/ocupacion.csv")
In [33]:
salarios_ocupacion.head(5)
Out[33]:
ccaa ocupacion sexo periodo salario_hora salario_año
0 Andalucía Alta Ambos sexos 2008 17.80 27948.84
1 Andalucía Alta Ambos sexos 2009 18.72 29275.72
2 Andalucía Alta Ambos sexos 2010 19.41 30421.77
3 Andalucía Alta Ambos sexos 2011 19.21 30463.95
4 Andalucía Alta Ambos sexos 2012 19.06 30026.52
In [34]:
salarios_ocupacion_nacional = salarios_ocupacion[(salarios_ocupacion['ccaa'] == "Total Nacional") & (salarios_ocupacion['sexo'] == "Ambos sexos")]
create_multi_category_plot(salarios_ocupacion_nacional, "periodo", "salario_año", "ocupacion", xlabel="Año", ylabel="Salario (€)",label="Nivel de Ocupación" ,xticks_rotation=0, style="whitegrid", figsize=(12, 7), title= "Salario Anual por Ocupación",save_path="../../images/salarios_ocupacion_nacional.png")
Plot saved to ../../images/salarios_ocupacion_nacional.png
No description has been provided for this image
In [35]:
create_multi_category_plot(salarios_ocupacion_nacional, "periodo", "salario_hora", "ocupacion", xlabel="Año", ylabel="Salario/Hora (€)",label="Nivel de Ocupación" ,xticks_rotation=0, style="whitegrid", figsize=(12, 7), title= "Salario por Hora por Ocupación",save_path="../../images/salarios_ocupacion_nacional.png")
Plot saved to ../../images/salarios_ocupacion_nacional.png
No description has been provided for this image

Observamos que no hay una diferencia particular en términos de crecimiento salarial, lo que a priori puede indicar que no hay ningún grupo especialmente afectado por el salario mínimo. Veamos como evoluciona el salario de la ocupación más baja respecto al SMI.

In [36]:
salario_oc_nacional_baja_smi = salarios_ocupacion_nacional[salarios_ocupacion_nacional['ocupacion'] == "Baja"].merge(smi, how="left", on="periodo")
create_dual_plot(salario_oc_nacional_baja_smi['periodo'], salario_oc_nacional_baja_smi['salario_año'], salario_oc_nacional_baja_smi['smi_14'], 
                 xlabel="Año", ylabel1="Salario Anual (€)", ylabel2="SMI (€)" ,label1= "Salario Anual", label2="SMI", title="Salario de ocupación baja y SMI",
                 xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None, secondary_y=True ,save_path="../../images/gastos_basicos_smi_nacional.png")
Plot saved to ../../images/gastos_basicos_smi_nacional.png
No description has been provided for this image
In [37]:
salario_oc_nacional_alta_smi = salarios_ocupacion_nacional[salarios_ocupacion_nacional['ocupacion'] == "Alta"].merge(smi, how="left", on="periodo")
create_dual_plot(salario_oc_nacional_alta_smi['periodo'], salario_oc_nacional_alta_smi['salario_año'], salario_oc_nacional_alta_smi['smi_14'], 
                 xlabel="Año", ylabel1="Salario Anual (€)", ylabel2="SMI (€)" ,label1= "Salario Anual", label2="SMI", title="Salario de ocupación baja y SMI",
                 xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None, secondary_y=True ,save_path="../../images/salario_alto_smi_nacional.png")
Plot saved to ../../images/salario_alto_smi_nacional.png
No description has been provided for this image

Aunque la evolución del salario de ocupacion baja parezca corelacionado con el salario mínimo, también lo parece así el de la ocupación alta, lo que puede descartar una causalidad. No obstante, hemos de tener en cuenta que las ocupaciones bajas corresponden a puestos que serán en general menos productivos y cuya productividad también crecerá en general más lento, por lo que es posible que el crecimiento de los salarios en en sectores de nivel de ocupación alta vaya más relacionado con la productividad y la de la ocupación baja más relacionado con el movimiento del salario mínimo.

También es importante tener en cuenta que a nivel político la propuesta de subida del salario mínimo gira en torno a llegar al 60% del salario medio, lo que implica algo de causalidad entre el nivel de salarios y la subida de salarios mínimos a realizar, si bien es cierto que al depender esta medida más de cuestiones políticas que de cuestiones económicas es precipitado dar por supuesta esta causalidad.

Veamos también cómo evoluciona el salario de las ocupaciones bajas en las comunidades autónomas que hemos mostrado antes:

In [38]:
salarios_ocupacion_ccaa = salarios_ocupacion[(salarios_ocupacion['ccaa'] != "Total Nacional") & (salarios_ocupacion['sexo'] == "Ambos sexos")]
salarios_oc_baja_ccaa = salarios_ocupacion_ccaa[(salarios_ocupacion_ccaa['ocupacion'] == "Baja") & (salarios_ocupacion_ccaa['ccaa'].isin(CCAA_mostrar))]
create_multi_category_plot(data = salarios_oc_baja_ccaa, x_col="periodo", y_col="salario_año", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Salario Anual (€)", title="Salario de ocupacion baja (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/salario_ocupacion_baja_ccaa.png")
Plot saved to ../../images/salario_ocupacion_baja_ccaa.png
No description has been provided for this image

Es interesante observar que en País Vasco y Navarra los salarios están en constante creciemiento, mientras que para las otras comunidades mostradas la tendencia es relativamente plana hasta 2015, a partir de cuando se empieza a ver un crecimiento más sólido, coincidiendo con el comienzo de los incrementos del salario mínmo más fuertes, lo que nos indica que no todas las comunidades autónomas siguen una correlación similar.

Es importante que de 2018 a 2019 (donde se produjo el mayor incremento de salario mínimo hasta la fecha) no necesariamente tenemos que ver un gran incremento del salario, puesto que una reducción del número de horas trabajadas amortiguaría el incremento.

Es interesante también, para enconctrar posibles grupos afectados, estudiar la evoluación de los salarios en función de la jornada y en función del contrato.

In [39]:
salarios_jornada = pd.read_csv("../../processed_data/salarios/jornada.csv")
salarios_jornada.head(5)
Out[39]:
jornada ccaa decil periodo salario_mes absence_data
0 Total Total Nacional Total decil 2022 2128.37 NaN
1 Total Total Nacional Total decil 2021 2086.78 NaN
2 Total Total Nacional Total decil 2020 2038.59 NaN
3 Total Total Nacional Total decil 2019 1982.31 NaN
4 Total Total Nacional Total decil 2018 1944.42 NaN
In [40]:
salarios_jornada.dtypes
Out[40]:
jornada          object
ccaa             object
decil            object
periodo           int64
salario_mes     float64
absence_data    float64
dtype: object
In [41]:
salarios_jornada["salario_año"] = salarios_jornada['salario_mes']*12
In [42]:
salarios_jornada_nacional = salarios_jornada[(salarios_jornada['ccaa'] == "Total Nacional") 
                                             & (salarios_jornada['decil'] == "Total decil")]
create_multi_category_plot(data = salarios_jornada_nacional, x_col="periodo", y_col="salario_año", label = "Tipo de Jornada",category_col="jornada", xlabel="Año", ylabel="Salario Anual (€)", title="Salario por tipo de Joranda (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/salario_jornada_nacional.png")
Plot saved to ../../images/salario_jornada_nacional.png
No description has been provided for this image

De nuevo se puede extraer una conclusión similar a la que comentábamos previamente, atendiendo a que el crecimiento de los sueldos se empieza a notar después de 2015 para los trabajadores a jornada parcial. Veamos si se puede apreciar algo por sector.

In [43]:
salarios_sector = pd.read_csv("../../processed_data/salarios/sector.csv")
salarios_sector.head(5)
Out[43]:
ccaa sector sexo periodo salario_año absence_data salario_hora
0 Andalucía Construcción Ambos sexos 2008 19839.25 NaN 11,55
1 Andalucía Construcción Ambos sexos 2009 20246.77 NaN 12,02
2 Andalucía Construcción Ambos sexos 2010 20801.34 NaN 12,19
3 Andalucía Construcción Ambos sexos 2011 21185.48 NaN 12,54
4 Andalucía Construcción Ambos sexos 2012 21204.91 NaN 12,53
In [44]:
salarios_sector_nacional = salarios_sector[(salarios_sector['ccaa'] == "Total Nacional") 
                                             & (salarios_sector['sexo'] == "Ambos sexos")]
create_multi_category_plot(data = salarios_sector_nacional, x_col="periodo", y_col="salario_año", label = "Sector",category_col="sector", xlabel="Año", ylabel="Salario Anual (€)", title="Salario por Sector (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/salario_sector_nacional.png")
Plot saved to ../../images/salario_sector_nacional.png
No description has been provided for this image

De nuevo, observamos que los conjuntos de salarios más bajos empiezan a tener un crecimiento sostenido tras 2015, mientras que en sectores mejor pagados como la industria el crecimiento es más continuado en todo el periodo analizado.

Empleos¶

El número de ocupados es otra de las métricas que puede ser afectadas por un incremento del salario mínimo, por lo que es importante estudiar el cambio de estos en el tiempo.

In [45]:
ocupados_jornada = pd.read_csv("../../processed_data/trabajo/ocupados_sector.csv")
ocupados_jornada.head(5)
Out[45]:
sexo ccaa tipo_jornada unidad periodo Total absence_data
0 Ambos sexos Total Nacional Total Valor absoluto 2024T3 21823.0 NaN
1 Ambos sexos Total Nacional Total Valor absoluto 2024T2 21684.7 NaN
2 Ambos sexos Total Nacional Total Valor absoluto 2024T1 21250.0 NaN
3 Ambos sexos Total Nacional Total Valor absoluto 2023T4 21389.7 NaN
4 Ambos sexos Total Nacional Total Valor absoluto 2023T3 21446.5 NaN
In [46]:
ocupados_jornada.unidad.unique()
Out[46]:
array(['Valor absoluto', 'Porcentaje'], dtype=object)
In [47]:
#Agrupamos por año haciendo la media
ocupados_jornada['año'] = ocupados_jornada['periodo'].str[0:4]
ocupados_jornada = ocupados_jornada.groupby(['sexo', 'ccaa', 'tipo_jornada', 'unidad', 'año'], as_index=False).mean(numeric_only=True)
In [48]:
ocupados_jornada
Out[48]:
sexo ccaa tipo_jornada unidad año Total absence_data
0 Ambos sexos Andalucía Jornada a tiempo completo Porcentaje 2002 91.450000 NaN
1 Ambos sexos Andalucía Jornada a tiempo completo Porcentaje 2003 90.975000 NaN
2 Ambos sexos Andalucía Jornada a tiempo completo Porcentaje 2004 91.075000 NaN
3 Ambos sexos Andalucía Jornada a tiempo completo Porcentaje 2005 87.325000 NaN
4 Ambos sexos Andalucía Jornada a tiempo completo Porcentaje 2006 87.325000 NaN
... ... ... ... ... ... ... ...
8275 Mujeres Total Nacional Total Valor absoluto 2020 8772.750000 NaN
8276 Mujeres Total Nacional Total Valor absoluto 2021 9100.325000 NaN
8277 Mujeres Total Nacional Total Valor absoluto 2022 9432.925000 NaN
8278 Mujeres Total Nacional Total Valor absoluto 2023 9805.550000 NaN
8279 Mujeres Total Nacional Total Valor absoluto 2024 10019.566667 NaN

8280 rows × 7 columns

In [49]:
ocupados_jornada_nacional = ocupados_jornada[(ocupados_jornada['ccaa'] == "Total Nacional") & (ocupados_jornada['sexo'] == "Ambos sexos")
                                             & (ocupados_jornada['unidad'] == "Valor absoluto")]
create_multi_category_plot(data = ocupados_jornada_nacional, x_col="año", y_col="Total", label = "Tipo de Jornada",category_col="tipo_jornada", xlabel="Año", ylabel="Ocupados (Miles de Personas)", title="Ocupados por tipo de Jornada (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ocupados_jornada_nacional.png")
Plot saved to ../../images/ocupados_jornada_nacional.png
No description has been provided for this image

Se aprecia de manera clara que el número de ocupados crece especialmente en tiempo completo, siendo el crecimiento del trabajo a tiempo parcial algo más residual en el tiempo, si bien es cierto qu elos porcentajes de cada uno sobre el total tienen una mayor variación. Veamos cómo evoluciona el porcentaje de ocupados a tiempo parcial dentro de cada comunidad autónoma.

In [50]:
ocupados_jornada_ccaa = ocupados_jornada[(ocupados_jornada['ccaa'].isin(CCAA_mostrar)) & (ocupados_jornada['sexo'] == "Ambos sexos")
                                             & (ocupados_jornada['unidad'] == "Porcentaje") & (ocupados_jornada['tipo_jornada'] == "Jornada a tiempo parcial")]
create_multi_category_plot(data = ocupados_jornada_ccaa, x_col="año", y_col="Total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Porcentaje (%)", title="Ocupacion a tiempo parcial (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ocupacion_parcial_ccaa.png")
Plot saved to ../../images/ocupacion_parcial_ccaa.png
No description has been provided for this image
In [51]:
ocupados_jornada_ccaa = ocupados_jornada[(ocupados_jornada['ccaa'].isin(CCAA_mostrar)) & (ocupados_jornada['sexo'] == "Ambos sexos")
                                             & (ocupados_jornada['unidad'] == "Valor absoluto") & (ocupados_jornada['tipo_jornada'] == "Total")]
create_multi_category_plot(data = ocupados_jornada_ccaa, x_col="año", y_col="Total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Ocupados (Miles de personas)", title="Ocupacion (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ocupacion_parcial_ccaa.png")
Plot saved to ../../images/ocupacion_parcial_ccaa.png
No description has been provided for this image

De nuevo, la tendencia es conjunta, pero la diferencia entre comunidades autónomas es notable. En los años de mayores subida del salario mínimo no se observa a priori ninguna variación que nos pueda indicar un impacto del salario mínimo en dichos años. El número total de ocupados tampoco parece indicarnos nada concreto.

PIB¶

El producto interior bruto (PIB), aparte de ser un buen indicador del tamaño de la región, es útil para determinar la riqueza de dicha región al dividirlo entre su número de habitantes (lo que sería el PIB per cápita).

In [79]:
pib_abs = pd.read_csv("../../processed_data/pib/pib_abs.csv")
pib_per_capita = pd.read_csv("../../processed_data/pib/pib_per_capita.csv")
In [80]:
pib_abs.head(5)
Out[80]:
ccaa valor periodo tipo_dato
0 Andalucía 86568676.0 2000 Valor
1 Aragón 20071592.0 2000 Valor
2 Asturias, Principado de 14305047.0 2000 Valor
3 Balears, Illes 16545333.0 2000 Valor
4 Canarias 26048646.0 2000 Valor
In [81]:
pib_per_capita.head(5)
Out[81]:
ccaa valor periodo tipo_dato
0 Andalucía 11856.0 2000 Valor
1 Aragón 16716.0 2000 Valor
2 Asturias, Principado de 13418.0 2000 Valor
3 Balears, Illes 20094.0 2000 Valor
4 Canarias 15622.0 2000 Valor
In [82]:
CCAA_mostrar
Out[82]:
['País Vasco',
 'Madrid, Comunidad de',
 'Navarra, Comunidad Foral de',
 'Extremadura',
 'Canarias',
 'Murcia, Región de']
In [83]:
pib_per_capita.ccaa.unique()
Out[83]:
array(['Andalucía', 'Aragón', 'Asturias, Principado de', 'Balears, Illes',
       'Canarias', 'Cantabria', 'Castilla y León', 'Castilla - La Mancha',
       'Cataluña', 'Comunitat Valenciana', 'Extremadura', 'Galicia',
       'Madrid, Comunidad de', 'Murcia, Región de',
       'Navarra, Comunidad Foral de', 'País Vasco', 'Rioja, La',
       'Ceuta y Melilla'], dtype=object)
In [84]:
pib_per_capita_ccaa = pib_per_capita[pib_per_capita['ccaa'].isin(CCAA_mostrar) & (pib_per_capita['tipo_dato'] == "Valor")]
create_multi_category_plot(data = pib_per_capita_ccaa, x_col="periodo", y_col="valor", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="PIB per Cápita (€)", title="PIB per Cápita (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/pib_per_capita_ccaa.png")
Plot saved to ../../images/pib_per_capita_ccaa.png
No description has been provided for this image

Observamos que las diferencias entre comunidades autónomas no son nada despreciables, pues Madrid dobla a lo largo de todo el periodo el PIB per capita de extremadura. Así mismo se ve además que el crecimiento de estas regiones más pobres es claramente inferior.

Paro¶

El paro nos indica el número de personas que no tienen empleo pero que estás buscando empleo activamente. Esta variable es de utilidad, pues variaciones en el paro pueden ser un buen predictor que acompañe al salario mínimo así como un buen resultado a estudiar a consecuencia de un incremento del SMI.

In [86]:
paro = pd.read_csv("../../processed_data/paro/parados.csv")
In [87]:
paro
Out[87]:
sexo ccaa edad periodo tasa_paro_total absence_data
0 Ambos sexos Total Nacional Total 2023 12.18 NaN
1 Ambos sexos Total Nacional Total 2022 13.03 NaN
2 Ambos sexos Total Nacional Total 2021 14.91 NaN
3 Ambos sexos Total Nacional Total 2020 15.53 NaN
4 Ambos sexos Total Nacional Total 2019 14.10 NaN
... ... ... ... ... ... ...
7555 Mujeres Melilla 55 y más años 2010 1.85 NaN
7556 Mujeres Melilla 55 y más años 2009 1.18 NaN
7557 Mujeres Melilla 55 y más años 2008 16.61 NaN
7558 Mujeres Melilla 55 y más años 2007 22.27 NaN
7559 Mujeres Melilla 55 y más años 2006 7.38 NaN

7560 rows × 6 columns

In [88]:
paro_ccaa = paro[(paro['ccaa'].isin(CCAA_mostrar)) & (paro['sexo'] == "Ambos sexos") & (paro['edad'] == "Total")]
create_multi_category_plot(data = paro_ccaa, x_col="periodo", y_col="tasa_paro_total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_ccaa.png")
Plot saved to ../../images/paro_ccaa.png
No description has been provided for this image

De nuevo, las diferencias entre comunidades autónomas son destacables. Aprovechando que tenemos el desglose por por edad y sexo, veamos cómo ha evolucionado el paro según estas dos variables.

In [89]:
paro_edad = paro[(paro['ccaa']=="Total Nacional") & (paro['sexo'] == "Ambos sexos") ]
create_multi_category_plot(data = paro_edad, x_col="periodo", y_col="tasa_paro_total", label = "Edad",category_col="edad", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro por edades", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_edad.png")
Plot saved to ../../images/paro_edad.png
No description has been provided for this image
In [91]:
paro.sexo.unique()
Out[91]:
array(['Ambos sexos', 'Hombres', 'Mujeres'], dtype=object)
In [92]:
paro_sexo = paro[(paro['ccaa']=="Total Nacional") & (paro['edad'] == "Total") ]
create_multi_category_plot(data = paro_sexo, x_col="periodo", y_col="tasa_paro_total", label = "Sexo",category_col="sexo", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro por sexo", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_sexo.png")
Plot saved to ../../images/paro_sexo.png
No description has been provided for this image
In [94]:
paro.edad.unique()
Out[94]:
array(['Total', 'Menores de 25 años', '25 y más años', 'De 16 a 19 años',
       'De 20 a 24 años', 'De 25 a 54 años', '55 y más años'],
      dtype=object)
In [97]:
paro['sexo-edad'] = paro['sexo'] + "-" + paro['edad']
paro_sexo_edad = paro[(paro['ccaa']=="Total Nacional") & (paro['sexo'].isin(['Hombres', 'Mujeres'])) & (paro['edad'].isin(['De 16 a 19 años', 'De 20 a 24 años', 'De 25 a 54 años', '55 y más años'])) ]
create_multi_category_plot(data = paro_sexo_edad, x_col="periodo", y_col="tasa_paro_total", label = "Sexo y Edad",category_col="sexo-edad", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro por sexo y edad", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_sexo_edad.png")
Plot saved to ../../images/paro_sexo_edad.png
No description has been provided for this image

Parece claro que los jóvenes son los más afectados por el desempleo, sufriendo los incrementos más grandes a lo largo del tiempo, y alcanzando los valores más altos. A priori este debería ser de los posibles grupos afectados por el salario mínimo, pues un incremento en el mismo podría provocar una mayor dificultad de inserción en el mercado laboral.

En lo que respesta a sexo, parece que el grupo más afectado son las mujeres dentro de todas las edades.

In [103]:
paro_duracion = pd.read_csv("../../processed_data/paro/parados_tiempo.csv")

Otro factor relevante a tener en cuenta en el análisis es qué porcentaje de parados son de larga duración, algo que puede pasar desapercibido en un análisis superficial y que puede ser un indicativo de efectos a más largo plazo como la dificultad de reinserción.

In [106]:
paro_duracion.head(5)
Out[106]:
sexo ccaa tiempo_busqueda periodo porcentaje_tipo_paro absence_data
0 Ambos sexos Total Nacional Total 2023 100.0 NaN
1 Ambos sexos Total Nacional Total 2022 100.0 NaN
2 Ambos sexos Total Nacional Total 2021 100.0 NaN
3 Ambos sexos Total Nacional Total 2020 100.0 NaN
4 Ambos sexos Total Nacional Total 2019 100.0 NaN
In [105]:
paro_duracion['tiempo_busqueda'].unique()
Out[105]:
array(['Total', 'Ya ha encontrado empleo', 'Menos de 1 mes',
       'De 1 mes a menos de 3 meses', 'De 3 meses a menos de 6 meses',
       'De 6 meses a menos de 1 año', 'De 1 año a menos de 2 años',
       '2 años o más'], dtype=object)
In [108]:
paro_tiempo_busqueda = paro_duracion[(paro_duracion['ccaa']=="Total Nacional") & (paro_duracion['sexo'] == "Ambos sexos") & (paro_duracion['tiempo_busqueda']!="Total")]
create_multi_category_plot(data = paro_tiempo_busqueda, x_col="periodo", y_col="porcentaje_tipo_paro", label = "Tiempo de búsqueda",category_col="tiempo_busqueda", xlabel="Año", ylabel="Porcentaje de parados (%)", title="Parados según su tiempo de búsqueda", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_tiempo_busqueda.png")
Plot saved to ../../images/paro_tiempo_busqueda.png
No description has been provided for this image
In [110]:
paro_tiempo_largo_ccaa= paro_duracion[(paro_duracion['ccaa'].isin(CCAA_mostrar)) & (paro_duracion['sexo'] == "Ambos sexos") 
                                      & (paro_duracion['tiempo_busqueda']=="2 años o más")]
create_multi_category_plot(data = paro_tiempo_largo_ccaa, x_col="periodo", y_col="porcentaje_tipo_paro", label = "CCAA",category_col="ccaa",
                            xlabel="Año", ylabel="Porcentaje de parados (%)", 
                           title="Parados de larga duración por comunidad autónoma", xticks_rotation=0, style="whitegrid", 
                           figsize=(12, 7), save_path="../../images/paro_tiempo_busqueda.png")
Plot saved to ../../images/paro_tiempo_busqueda.png
No description has been provided for this image

Al igual que con todas las variables previamente observadas, vemos que la evolución por comunidad autónoma sigue la misma tendencia, aunque las diferencias entre cada una no se pueden pasar por alto.

Productividad¶

La productividad es un factor importante al estudiar el salario mínimo. Una alta productividad da más margen para incrementos salariales, mientras que una baja productividad puede fomentar una mayor cantidad de despidos.

El dataset escogido de productividad, obtenido del Observatorio de Productividad y Competitividad de España (OPCE) contiene además información útil sobre qué componentes son los que contribuyen a la productividad

In [112]:
productividad = pd.read_csv("../../processed_data/productividad/productividad_ccaa.csv")
In [122]:
productividad = productividad[productividad.periodo>=2008]
In [123]:
productividad.variable.unique()
Out[123]:
array(['VAB', 'Empleo total', 'Horas trabajadas totales',
       'Capital productivo',
       'Productividad del trabajo por hora trabajada',
       'Productividad del trabajo por ocupado',
       'Productividad del capital productivo',
       'Contribución del capital productivo al crecimiento del VAB',
       'Contribución de las horas trabajadas al crecimiento del VAB',
       'Contribución de los cambios en la composición del trabajo al crecimiento del VAB',
       'Contribución de la PTF al crecimiento del VAB',
       'Contribución del capital productivo al crecimiento de la productividad por hora trabajada',
       'Contribución de la PTF al crecimiento de la productividad por hora trabajada',
       'Participación de los servicios del capital en el VAB',
       'Participación de las rentas del trabajo en el VAB'], dtype=object)
In [124]:
productividad_hora = productividad[(productividad['variable'] == 'Productividad del trabajo por hora trabajada') & (productividad.unidad == "Euros de 2015 por hora trabajada")]
productividad_hora_ccaa = productividad_hora[productividad_hora['ccaa'].isin(CCAA_mostrar)]
create_multi_category_plot(data = productividad_hora_ccaa, x_col="periodo", y_col="total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Productividad (€)", title="Productividad del trabajo por hora (€ de 2015)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/productividad_hora.png")
Plot saved to ../../images/productividad_hora.png
No description has been provided for this image
In [138]:
productividad_ocupado = productividad[(productividad['variable'] == 'Productividad del trabajo por ocupado') & (productividad.unidad == "Euros de 2015 por persona ocupada")]
productividad_ocupado_ccaa = productividad_ocupado[productividad_ocupado['ccaa'].isin(CCAA_mostrar)]
create_multi_category_plot(data = productividad_ocupado_ccaa, x_col="periodo", y_col="total", label = "CCAA",category_col="ccaa", 
                           xlabel="Año", ylabel="Productividad (€)", title="Productividad por ocupado (€ de 2015)", 
                           xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/productividad_ocupado.png")
Plot saved to ../../images/productividad_ocupado.png
No description has been provided for this image
In [146]:
#Obtenemos el promedio de horas por empleo para ver la evolución
empleo = productividad[(productividad.variable == "Empleo total") & 
                       (productividad.unidad == "Miles de personas")].drop(['variable', 'unidad'], axis=1).rename(columns = {'total': 'empleo'})
horas_trabajadas = productividad[(productividad.variable == "Horas trabajadas totales") & 
                                 (productividad.unidad == "Millones de horas")].drop(['variable', 'unidad'], axis=1).rename(columns = {'total': 'horas_trabajadas'})

empleo_hora = pd.merge(empleo, horas_trabajadas, on=['periodo', 'ccaa'])
empleo_hora['empleo_hora'] = empleo_hora.horas_trabajadas/empleo_hora.empleo
In [148]:
create_multi_category_plot(data = empleo_hora[empleo_hora['ccaa'].isin(CCAA_mostrar)], x_col="periodo", y_col="empleo_hora", label = "CCAA",category_col="ccaa", 
                           xlabel="Año", ylabel="Miles de horas", title="Horas trabajadas por empleo", 
                           xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/horas_empleo.png")
Plot saved to ../../images/horas_empleo.png
No description has been provided for this image

De estas gráficas se puede extraer la conclusión de que comunidades autónomas como Canarias tienen una mayor proporción de empleo poco productivo, pues pese a trabajar de media más horas que un vasco la productividad por hora agregada a partir de 2015 acaba siendo menor.

Empresas¶

Las empresas y tamaño nos pueden informar de qué tan resistente puede ser una economía dada a un incremento del salario mínimo, pues empresas pequeñas con menos recursos tendrán menos capacidad de hacer frente a los gastos necesarios y consecuentemente podrán optar más por el despido o por cerrar.

In [161]:
empresas = pd.read_csv("../../processed_data/empresas/empresas.csv")
In [162]:
empresas.estrato_asalariados_grupo.unique()
Out[162]:
array(['Total', 'No asalariados', 'Pequeñas y Medianas Empresas',
       'Grandes Empresas'], dtype=object)
In [163]:
empresas
Out[163]:
ccaa actividad_principal estrato_asalariados periodo total_empresas 2_dig estrato_asalariados_grupo
0 Total Nacional Total CNAE Total 2020 3404428 Total CNAE Total
1 Total Nacional Total CNAE Total 2019 3363197 Total CNAE Total
2 Total Nacional Total CNAE Total 2018 3337646 Total CNAE Total
3 Total Nacional Total CNAE Total 2017 3282346 Total CNAE Total
4 Total Nacional Total CNAE Total 2016 3236582 Total CNAE Total
... ... ... ... ... ... ... ...
1048570 Ceuta 501 Transporte marítimo de pasajeros De 50 a 99 2017 0 50 Pequeñas y Medianas Empresas
1048571 Ceuta 501 Transporte marítimo de pasajeros De 50 a 99 2016 0 50 Pequeñas y Medianas Empresas
1048572 Ceuta 501 Transporte marítimo de pasajeros De 50 a 99 2015 0 50 Pequeñas y Medianas Empresas
1048573 Ceuta 501 Transporte marítimo de pasajeros De 50 a 99 2014 0 50 Pequeñas y Medianas Empresas
1048574 Ceuta 501 Transporte marítimo de pasajeros De 50 a 99 2013 0 50 Pequeñas y Medianas Empresas

1048575 rows × 7 columns

In [165]:
empresas_todo = empresas[(empresas.ccaa == "Total Nacional") & (empresas.actividad_principal == "Total CNAE") & (empresas.estrato_asalariados != "Total")].groupby(['periodo', 'estrato_asalariados_grupo'], as_index=False).agg({'total_empresas': 'sum'})
create_multi_category_plot(data = empresas_todo, x_col="periodo", y_col="total_empresas", label = "Estrato de Asalariados",category_col="estrato_asalariados_grupo", 
                           xlabel="Año", ylabel="Número de empresas", title="Empresas por Estrato de Asalariados", 
                           xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/empresas_asalariados.png")
Plot saved to ../../images/empresas_asalariados.png
No description has been provided for this image
In [167]:
empresas.estrato_asalariados.unique()
Out[167]:
array(['Total', 'Sin asalariados', 'De 1 a 2', 'De 3 a 5', 'De 6 a 9',
       'De 10 a 19', 'De 20 a 49', 'De 50 a 99', 'De 100 a 199',
       'De 200 a 499', 'De 500 a 999', 'De 1000 a 4999',
       'De 5000 o más asalariados'], dtype=object)
In [170]:
empresas_pequeñas_ccaa
Out[170]:
periodo ccaa total_empresas actividad_principal estrato_asalariados total_empresas_total 2_dig estrato_asalariados_grupo porcentaje_empresas_pequeñas
0 2008 Canarias 67647 Total CNAE Total 143471 Total CNAE Total 4.715030e-01
1 2008 Canarias 67647 05 Extracción de antracita, hulla y lignito Total 1 05 Total 6.764700e+04
2 2008 Canarias 67647 051 Extracción de antracita y hulla Total 1 05 Total 6.764700e+04
3 2008 Canarias 67647 052 Extracción de lignito Total 0 05 Total inf
4 2008 Canarias 67647 06 Extracción de crudo de petróleo y gas natural Total 0 06 Total inf
... ... ... ... ... ... ... ... ... ...
26047 2020 País Vasco 66775 95 Reparación de ordenadores, efectos personal... Total 971 95 Total 6.876931e+01
26048 2020 País Vasco 66775 951 Reparación de ordenadores y equipos de com... Total 155 95 Total 4.308065e+02
26049 2020 País Vasco 66775 952 Reparación de efectos personales y artícul... Total 816 95 Total 8.183211e+01
26050 2020 País Vasco 66775 96 Otros servicios personales Total 6140 96 Total 1.087541e+01
26051 2020 País Vasco 66775 960 Otros servicios personales Total 6140 96 Total 1.087541e+01

26052 rows × 9 columns

In [171]:
empresas_pequeñas_ccaa = empresas[empresas.ccaa.isin(CCAA_mostrar) & (empresas.estrato_asalariados.isin(['De 1 a 2', 'De 3 a 5', 'De 6 a 9', 'De 10 a 19'])) & (empresas.actividad_principal == "Total CNAE")].groupby(['periodo', 'ccaa'], as_index=False).agg({'total_empresas': 'sum'})
total_empresas = empresas[(empresas.estrato_asalariados == "Total") & (empresas.actividad_principal == "Total CNAE") ].rename(columns={'total_empresas': 'total_empresas_total'})
empresas_pequeñas_ccaa = empresas_pequeñas_ccaa.merge(total_empresas, on = ['periodo', 'ccaa'], how="left")
empresas_pequeñas_ccaa['porcentaje_empresas_pequeñas'] = empresas_pequeñas_ccaa['total_empresas']/empresas_pequeñas_ccaa['total_empresas_total']
create_multi_category_plot(data = empresas_pequeñas_ccaa, x_col="periodo", y_col="porcentaje_empresas_pequeñas", label = "CCAA",category_col="ccaa", 
                           xlabel="Año", ylabel="Porcentaje (%)", title="Proporción de empresas pequeñas (1 a 20 trabajadores) por CCAA", 
                           xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/empresas_pequeñas_ccaa.png")
Plot saved to ../../images/empresas_pequeñas_ccaa.png
No description has been provided for this image
In [172]:
empresas_pequeñas_ccaa = empresas[empresas.ccaa.isin(CCAA_mostrar) & ~(empresas.estrato_asalariados.isin(['Sin asalariados','De 1 a 2', 'De 3 a 5', 'De 6 a 9', 'De 10 a 19'])) & (empresas.actividad_principal == "Total CNAE")].groupby(['periodo', 'ccaa'], as_index=False).agg({'total_empresas': 'sum'})
total_empresas = empresas[(empresas.estrato_asalariados == "Total") & (empresas.actividad_principal == "Total CNAE") ].rename(columns={'total_empresas': 'total_empresas_total'})
empresas_pequeñas_ccaa = empresas_pequeñas_ccaa.merge(total_empresas, on = ['periodo', 'ccaa'], how="left")
empresas_pequeñas_ccaa['porcentaje_empresas_pequeñas'] = empresas_pequeñas_ccaa['total_empresas']/empresas_pequeñas_ccaa['total_empresas_total']
create_multi_category_plot(data = empresas_pequeñas_ccaa, x_col="periodo", y_col="porcentaje_empresas_pequeñas", label = "CCAA",category_col="ccaa", 
                           xlabel="Año", ylabel="Porcentaje (%)", title="Proporción de empresas con >20 trabajadores por CCAA", 
                           xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/empresas_medianas_ccaa.png")
Plot saved to ../../images/empresas_medianas_ccaa.png
No description has been provided for this image

Se observa que el mercado está dominado por pequeñas y medianas empresas y por empresas sin asalariados, mientras que las grandes empresas tienen una presencia prácticamente despreciable. A nivel de comunidad autónoma se aprecia que la proporción de empresas con pocos empleados es dispar entre comunidades autónomas, y que esta disparidad no guarda un ordenamiento parecido al que hayamos observado en el pib o la productividad.

En lo que respecta a las empresas con más de 20 empleados, estas suponen un valor residual que no explica el decrecimiento porcentual de las empresas pequeñas a partir de 2015, y este vendría principalmente explicado por el incremento de empresas sin asalariados.

In [151]:
empresas.periodo.min()
Out[151]:
2008
In [152]:
flujo_empresas = pd.read_csv("../../processed_data/empresas/flujo_empresas_nacional.csv")
In [153]:
flujo_empresas
Out[153]:
cond_juridica actividad_principal_grupo estrato_asalariados periodo alta_empresas 2_dig_x baja_empresas 2_dig_y permanencias 2_dig
0 Otras formas jurídicas 05 Extracción de antracita, hulla y lignito De 1 a 5 2007 0 05 0 05 3 05
1 Otras formas jurídicas 05 Extracción de antracita, hulla y lignito De 1 a 5 2008 0 05 1 05 2 05
2 Otras formas jurídicas 05 Extracción de antracita, hulla y lignito De 1 a 5 2009 0 05 1 05 1 05
3 Otras formas jurídicas 05 Extracción de antracita, hulla y lignito De 1 a 5 2010 0 05 0 05 0 05
4 Otras formas jurídicas 05 Extracción de antracita, hulla y lignito De 1 a 5 2011 0 05 0 05 0 05
... ... ... ... ... ... ... ... ... ... ...
39355 Total Total CNAE Total 2018 431528 Total CNAE 349350 Total CNAE 2931669 Total CNAE
39356 Total Total CNAE Total 2019 423837 Total CNAE 372856 Total CNAE 2980591 Total CNAE
39357 Total Total CNAE Total 2020 321749 Total CNAE 366548 Total CNAE 3044821 Total CNAE
39358 Total Total CNAE Total 2021 382960 Total CNAE 316340 Total CNAE 3047703 Total CNAE
39359 Total Total CNAE Total 2022 352142 Total CNAE 355028 Total CNAE 2855438 Total CNAE

39360 rows × 10 columns

In [173]:
flujo_empresas.actividad_principal_grupo.unique()
Out[173]:
array(['05 Extracción de antracita, hulla y lignito',
       '06 Extracción de crudo de petróleo y gas natural',
       '07 Extracción de minerales metálicos',
       '08 Otras industrias extractivas',
       '09 Actividades de apoyo a las industrias extractivas',
       '10 Industria de la alimentación', '11 Fabricación de bebidas',
       '12 Industria del tabaco', '13 Industria textil',
       '14 Confección de prendas de vestir',
       '15 Industria del cuero y del calzado',
       '16 Industria de la madera y del corcho, excepto muebles, cestería y espartería',
       '17 Industria del papel',
       '18 Artes gráficas y reproducción de soportes grabados',
       '19 Coquerías y refino de petróleo', '20 Industria química',
       '21 Fabricación de productos farmacéuticos',
       '22 Fabricación de productos de caucho y plásticos',
       '23 Fabricación de otros productos minerales no metálicos',
       '24 Metalurgia, fabricación de productos de hierro, acero y ferroaleaciones',
       '25 Fabricación de productos metálicos, excepto maquinaria y equipo',
       '26 Fabricación de productos informáticos, electrónicos y ópticos',
       '27 Fabricación de material y equipo eléctrico',
       '28 Fabricación de maquinaria y equipo n.c.o.p.',
       '29 Fabricación de vehículos de motor, remolques y semirremolques',
       '30 Fabricación de otro material de transporte',
       '31 Fabricación de muebles', '32 Otras industrias manufactureras',
       '33 Reparación e instalación de maquinaria y equipo',
       '35 Suministro de energía eléctrica, gas, vapor y aire acondicionado',
       '36 Captación, depuración y distribución de agua',
       '37 Recogida y tratamiento de aguas residuales',
       '38 Recogida, tratamiento y eliminación de residuos, valorización',
       '39 Actividades de descontaminación y otros servicios de gestión de residuos',
       '41 Construcción de edificios', '42 Ingeniería civil',
       '43 Actividades de construcción especializada',
       '45 Venta y reparación de vehículos de motor y motocicletas',
       '46 Comercio al por mayor e intermediarios del comercio, excepto de vehículos de motor y motocicletas',
       '47 Comercio al por menor, excepto de vehículos de motor y motocicletas',
       '49 Transporte terrestre y por tubería',
       '50 Transporte marítimo y por vías navegables interiores',
       '51 Transporte aéreo',
       '52 Almacenamiento y actividades anexas al transporte',
       '53 Actividades postales y de correos',
       '55 Servicios de alojamiento', '56 Servicios de comidas y bebidas',
       '58 Edición',
       '59 Actividades cinematográficas, de vídeo y de programas de televisión, grabación de sonido y edición musical',
       '60 Actividades de programación y emisión de radio y televisión',
       '61 Telecomunicaciones',
       '62 Programación, consultoría y otras actividades relacionadas con la informática',
       '63 Servicios de información',
       '64 Servicios financieros, excepto seguros y fondos de pensiones',
       '65 Seguros, reaseguros y fondos de pensiones, excepto Seguridad Social obligatoria',
       '66 Actividades auxiliares a los servicios financieros y a los seguros',
       '68 Actividades inmobiliarias',
       '69 Actividades jurídicas y de contabilidad',
       '70 Actividades de las sedes centrales, actividades de consultoría de gestión empresarial',
       '71 Servicios técnicos de arquitectura e ingeniería, ensayos y análisis técnicos',
       '72 Investigación y desarrollo',
       '73 Publicidad y estudios de mercado',
       '74 Otras actividades profesionales, científicas y técnicas',
       '75 Actividades veterinarias', '77 Actividades de alquiler',
       '78 Actividades relacionadas con el empleo',
       '79 Actividades de agencias de viajes, operadores turísticos, servicios de reservas y actividades relacionadas con los mismos',
       '80 Actividades de seguridad e investigación',
       '81 Servicios a edificios y actividades de jardinería',
       '82 Actividades administrativas de oficina y otras actividades auxiliares a las empresas',
       '85 Educación', '86 Actividades sanitarias',
       '87 Asistencia en establecimientos residenciales',
       '88 Actividades de servicios sociales sin alojamiento',
       '90 Actividades de creación, artísticas y espectáculos',
       '91 Actividades de bibliotecas, archivos, museos y otras actividades culturales',
       '92 Actividades de juegos de azar y apuestas',
       '93 Actividades deportivas, recreativas y de entretenimiento',
       '94 Actividades asociativas',
       '95 Reparación de ordenadores, efectos personales y artículos de uso doméstico',
       '96 Otros servicios personales', 'Total CNAE'], dtype=object)
In [154]:
flujo_empresas[['actividad_principal_grupo', '2_dig']].drop_duplicates()
Out[154]:
actividad_principal_grupo 2_dig
0 05 Extracción de antracita, hulla y lignito 05
480 06 Extracción de crudo de petróleo y gas natural 06
960 07 Extracción de minerales metálicos 07
1440 08 Otras industrias extractivas 08
1920 09 Actividades de apoyo a las industrias extra... 09
... ... ...
36960 93 Actividades deportivas, recreativas y de en... 93
37440 94 Actividades asociativas 94
37920 95 Reparación de ordenadores, efectos personal... 95
38400 96 Otros servicios personales 96
38880 Total CNAE Total CNAE

82 rows × 2 columns

Pobreza y Desigualdad¶

La pobreza y la desigualdad suponen dos factores que nivel conceptual no deberían tener efecto como variable de entrada en un modelo en ninguno de las variables mencionadas previamente, pero sí que son una variable de salida interesante a estudiar, pues los incrementos de salario mínimo se justifican bajo la promeso de reducir desigualdad y pobreza.

In [ ]:
 
In [ ]: